<?php

/**
*Clase que manipula las facturas
*
*Esta clase informa acerca de lo que debe pagar un cliente para posteriormente imprimirlo en una factura.
*
*@author gush
*@author pegudo
*@package controller
*/

Class InformesController extends AppController 
{
	var $name = 'Informes';
	var $uses = array();
	var $helpers = array('ajax');
	var $components = array('ModelLoader');
	
	
	/*PRUEBA*/
	
	function anualCliente($iIdCliente){
		$this->set('iIdCliente',$iIdCliente);
		$this->requestAction("informes/graficarClienteCustodias/$iIdCliente/800/");//dibuja y retorna las cajas custodiadas
		$this->layout = false;
	}
	
	
	/**
	*Esta funcion setea el menu de los informes.
	*/
	function index(){
		$this->setearSubMenu();
		$this->listarInformarClientes();
		$this->render('listarInformarClientes');
	}
		
	function listarInformarClientes(){
		//seteo el submenu
		$this->setearSubMenu();
		//setea los clientes
		$clientes = $this->requestAction('/clientes/seleccionarClientes');
		$this->set('clientes',$clientes);
	}

	function informarCliente(){
		//seteo el submenu de informes
		$this->setearSubMenu();
		
		$iIdCliente = $this->data['Cliente']['id'];
		//consulto todos los datos del cliente
		$cliente = $this->requestAction("clientes/getCliente/$iIdCliente");
		//seteo los datos del cliente
		$this->set('iIdCliente',$cliente['Cliente']['id']);
		$this->set('sNombreCliente',$cliente['Cliente']['nombre']);
	}

	
	function releerCustodias($iIdCliente){
		//,$meses=12
		$meses = $this->data['Informe']['meses'];
		$this->set('meses',$meses);
		$this->set('iIdCliente', $iIdCliente);
	    $this->render('graficar_cliente_custodias', 'ajax');
	}
	
	/**
	 * Consulta las custodias de un cliente y grafica dichos valores
	 * @return null
	 */
	function informarClienteCustodias($iIdCliente){
		//$this->getCustodiasJson(20,'2007-11-30');
		$this->setearSubMenu();
		$this->set('iIdCliente',$iIdCliente);
	}
	
	/*
	 * Esta funcion grafica las cajas custodiadas de un cliente.
	 * @param $iIdCliente
	 * @param $iMeses : la cantidad de meses que se grafican
	 * @param $iWidth : ancho de la grafica
	 * @param $iHeigth : alto de la grafica
	 * @iShowLegend : 1 muestra la leyenda, 0 no muestra la leyenda
	 */
	function graficarClienteCustodias($iIdCliente,$iMeses=12,$iWidth=500,$iHeight=250,$iShowLegend=1){

		$aMeses[1] = "Ene";
		$aMeses[2] = "Feb";
		$aMeses[3] = "Mar";
		$aMeses[4] = "Abr";
		$aMeses[5] = "May";
		$aMeses[6] = "Jun";
		$aMeses[7] = "Jul";
		$aMeses[8] = "Ago";
		$aMeses[9] = "Sep";
		$aMeses[10] = "Oct";
		$aMeses[11] = "Nov";
		$aMeses[0] = "Dic";

		$dFechaActual = $this->ultimoDia(date("Y-m-d"));
		
		//la fecha desde es la fecha actual menos 12 meses
		$mesAtras = $iMeses;
		$aFechaDesde = explode('-',$dFechaActual);

		$dFechaDesde =  date("Y-m-d", mktime(0, 0, 0, $aFechaDesde[1]-$mesAtras, 1, $aFechaDesde[0]));
		$dFechaDesde = $this->ultimoDia($dFechaDesde);
		$dFechaHasta = $this->agregarMes($dFechaDesde);
		$dFechaHasta = $this->ultimoDia($dFechaHasta);
		
		$aFecha = explode('-',$dFechaHasta);
		$mesIni = $aFecha[1];
		
		if(isset($iMeses)){
			$dFechaActual = $this->ultimoDia($dFechaActual);
			$i = 0;
			$totalAnt = 0;

			while($dFechaActual >= $dFechaHasta ){
				
				$prest = $this->requestAction("prestacions/getCantCajasCustodiadas/$iIdCliente/$dFechaDesde/$dFechaHasta/");
				$cajas[$i] = $prest;

				$cajas[$i]['total'] = $totalAnt + $cajas[$i]['altas'] - $cajas[$i]['bajas'];
				$totalAnt = $cajas[$i]['total'];
				
				//fecha entera
				$cajas[$i]['fecha'] = $dFechaHasta;
				
				//guarda la fecha
				$indice_mes = ($mesIni + $i) % 12;
				$nombreMes = $aMeses[$indice_mes];
				$tmp = explode('-',$dFechaHasta);
				$anio = substr(($tmp[0]),2,4);
				$cajas[$i]['mes'] = $nombreMes.' '.$anio;
				
				//avanza un mes
				$dFechaDesde = $dFechaHasta;
				$dFechaHasta = $this->agregarMes($dFechaHasta);
				$dFechaHasta = $this->ultimoDia($dFechaHasta);
				$i ++;

			}
			
			//para saber las dimensiones de la grafica
			$cantMax = 0;
			
			//asigna los valores para ser graficados
			for($i=0;$i<$mesAtras;$i++)
			{
				if(isset($cajas[$i])){
					
					$total = $cajas[$i]['total'];

					//se cargan los datos
					$aValores[] = $total;
					
					//se busca la maxima/minima cantidad de dinero pagado
					if($total > $cantMax)
						$cantMax = $total;
				}
				$aLabels[] = $cajas[$i]['mes'];
			}

			$aData[0]['data'] = $aValores;
			$aData[0]['alpha'] = 60;
			$aData[0]['colorLinea'] = '#000FFF';
			$aData[0]['tamKey'] = 10;
			$aData[0]['leyenda'] = 'Cajas Custodiadas';
			$aData[0]['toolTip'] = '#key#: #val#';
		}
		
		
		$sTitulo= "Custodia de Cajas";
		$yLegend='Cajas';
		$xLegend='Meses';
		$aLabelX= $aLabels;
		$iYmin=0;
		$iYmax=$cantMax + 50;
		
		$this->dataLineGraph($aData,$sTitulo,$yLegend,$xLegend,$aLabelX,$iWidth,$iHeight,$iYmin,$iYmax,$iShowLegend);
			
		return $cajas;
	}
	
	/*
	 * Retorna una estructura json para realizar la grilla con las custodias de un mes en particular
	 * @param $iIdCliente: integer
	 * @param $dFecha: fecha fin de la prestacion
	 * @return string con la estructura json OR vacio
	 */
	function getCustodiasJson($iIdCliente,$dFecha){
		
		$iIdCustodia = 2;
		$iIdExpurgue = 3;
		
		//obtengo las prestaciones
		$this->ModelLoader->setController($this);
		$this->ModelLoader->load('Prestacion');		
		$sConditions = "(Prestacion.precio <> 0) AND clientes_id = $iIdCliente AND fecha_fin = '$dFecha' AND ( servicios_id = $iIdCustodia OR servicios_id = $iIdExpurgue ) ORDER BY id";
		$aFields = array('fecha_inicio','cantidad','servicios_id');
		$this->Prestacion->unBindModel(array("belongsTo"=>array("Servicio")));
		$aPrest = $this->Prestacion->findAll($sConditions,$aFields);
		
		$sFilas = '[';
		foreach($aPrest as $data){
			$data = $data['Prestacion'];
			$sFilas .= json_encode($data).",";
		}
		$tam = strlen($sFilas);
		$sFilas = substr($sFilas,0,$tam-1);
		$sFilas .= ']';
		$this->layout = false;
		if($tam==1){
			echo '';
		}
		else
			echo $sFilas;
	}
	
	function releerCompras($iIdCliente){
		//,$meses=12
		$meses = $this->data['Informe']['meses'];
		$this->set('meses',$meses);
		$this->set('iIdCliente', $iIdCliente);
	    $this->render('graficar_cliente_compras', 'ajax');
	}

	/*
	 * Consulta las compras de un cliente y grafica dichos valores
	 * @return null
	 */
	function informarClienteCompras($iIdCliente){

		$this->setearSubMenu();
		$this->set('iIdCliente',$iIdCliente);
	}
	
	function graficarClienteCompras($iIdCliente,$iMeses=12,$iWidth=500,$iHeight=250,$iShowLegend=1){
		
		$aMeses[1] = "Ene";
		$aMeses[2] = "Feb";
		$aMeses[3] = "Mar";
		$aMeses[4] = "Abr";
		$aMeses[5] = "May";
		$aMeses[6] = "Jun";
		$aMeses[7] = "Jul";
		$aMeses[8] = "Ago";
		$aMeses[9] = "Sep";
		$aMeses[10] = "Oct";
		$aMeses[11] = "Nov";
		$aMeses[0] = "Dic";

		$dFechaActual = $this->ultimoDia(date("Y-m-d"));
		
		//la fecha desde es la fecha actual menos 12 meses
		$mesAtras = $iMeses;
		$aFechaDesde = explode('-',$dFechaActual);

		$dFechaDesde =  date("Y-m-d", mktime(0, 0, 0, $aFechaDesde[1]-$mesAtras, 1, $aFechaDesde[0]));
		$dFechaDesde = $this->ultimoDia($dFechaDesde);

		$dFechaHasta = $this->agregarMes($dFechaDesde);
		$dFechaHasta = $this->ultimoDia($dFechaHasta);
		
		$aFecha = explode('-',$dFechaHasta);
		$mesIni = $aFecha[1];
		
		$iIdServicio = 5;
		
		if(isset($iMeses)){
			$dFechaActual = $this->ultimoDia($dFechaActual);
			$i = 0;
			$totalAnt = 0;
			while($dFechaActual >= $dFechaHasta){

				$prest = $this->requestAction("clientes/getCantidadServicio/$iIdCliente/$iIdServicio/$dFechaHasta/");
				$cajas[$i]['cant'] = $prest;
				
				//fecha entera
				$cajas[$i]['fecha'] = $dFechaHasta;
				
				//guarda la fecha
				$indice_mes = ($mesIni + $i) % 12;
				$nombreMes = $aMeses[$indice_mes];
				$tmp = explode('-',$dFechaHasta);
				$anio = substr(($tmp[0]),2,4);
				$cajas[$i]['mes'] = $nombreMes.' '.$anio;
				
				//avanza un mes
				$dFechaHasta = $this->agregarMes($dFechaHasta);
				$dFechaHasta = $this->ultimoDia($dFechaHasta);
				$i ++;
			}

			//para saber las dimensiones de la grafica
			$cantMax = 0;
			
			$ant = 0;
			$cajasCompradasAnterior = 0;
			
			//asigna los valores para ser graficados
			for($i=0;$i<$mesAtras;$i++){
				if(isset($cajas[$i])){
					$total = $cajas[$i]['cant'] - $cajasCompradasAnterior;
					//se cargan los datos
					$datos[] = $total;
				
					//se busca la maxima/minima cantidad
					if($total > $cantMax)$cantMax = $total;

					if($i!=0)$ant++;
						$cajasCompradasAnterior = $cajas[$ant]['cant'];//para actualizar el mes
				}
				$aLabels[] =  $cajas[$i]['mes'];
			}
			
			$aData[0]['data'] = $datos;
			$aData[0]['alpha'] = 60;
			$aData[0]['colorLinea'] = '#000FFF';
			$aData[0]['tamKey'] = 10;
			$aData[0]['leyenda'] = 'Cajas';
		}
		
		
		$sTitulo= "Compra de Cajas";
		$yLegend='Cajas';
		$xLegend='Meses';
		$aLabelX= $aLabels;
		$iYmin=0;
		$iYmax=$cantMax + 50;
		
		$this->dataLineGraph($aData,$sTitulo,$yLegend,$xLegend,$aLabelX,$iWidth,$iHeight,$iYmin,$iYmax,$iShowLegend);
			
			
	}

	/**
	 * Consulta los pagos de un cliente y grafica dichos valores
	 * @return null
	 */
	function informarClientePagos($iIdCliente){

		$this->setearSubMenu();
		$this->set('iIdCliente',$iIdCliente);
	}
	
	function graficarClientePagos($iIdCliente,$iMeses=12,$iWidth=500,$iHeight=250,$iShowLegend=1){
		
		$aMeses[1] = "Ene";
		$aMeses[2] = "Feb";
		$aMeses[3] = "Mar";
		$aMeses[4] = "Abr";
		$aMeses[5] = "May";
		$aMeses[6] = "Jun";
		$aMeses[7] = "Jul";
		$aMeses[8] = "Ago";
		$aMeses[9] = "Sep";
		$aMeses[10] = "Oct";
		$aMeses[11] = "Nov";
		$aMeses[0] = "Dic";

		$dFechaDesde = $this->requestAction("clientes/getFechaInicioContrato/$iIdCliente");
		$dFechaFinContrato = $this->requestAction("clientes/getFechaFinContrato/$iIdCliente");
		$dFechaHasta = $this->ultimoDia($dFechaDesde);
		$dFechaActual = $this->requestAction("historialprecios/getUltimoMesCerrado/$iIdCliente");
		$aFecha = explode('-',$dFechaHasta);
		$mesIni = $aFecha[1];
		
		$aData = array();
		
		if(isset($iMeses) && $dFechaActual!=0){

			$dFechaActual = $this->ultimoDia($dFechaActual);
			$i = 0;

			while($dFechaActual >= $dFechaHasta){

				$retorno = $aClienteEstado = $this->requestAction("cuentas/getDeudaCliente/$iIdCliente/$dFechaHasta/");

				$pagos[$i] = $retorno;
				
				//fecha entera
				$pagos[$i]['fecha'] = $dFechaHasta;
				
				//guarda la fecha
				$indice_mes = ($mesIni + $i) % 12;
				$nombreMes = $aMeses[$indice_mes];
				$tmp = explode('-',$dFechaHasta);
				$anio = substr(($tmp[0]),2,4);
				$pagos[$i]['mes'] = $nombreMes.' '.$anio;
				
				//avanza un mes
				$dFechaDesde = $dFechaHasta;
				$dFechaHasta = $this->agregarMes($dFechaHasta);
				$dFechaHasta = $this->ultimoDia($dFechaHasta);
				$i ++;
			}
			
		
			$mesAtras = $i;

			
			//para saber las dimensiones de la grafica
			$cantMax = 0;

			//variables para calcular los pagos mensuales
			$ant = 0;
			$anterior['debe'] = 0;
			$anterior['pago'] = 0;

			for($i=0;$i<$mesAtras;$i++)
			{
				if(isset($pagos[$i]))
				{
					$debe = $pagos[$i]['debe'];
					$pago = $pagos[$i]['pago'];
					//se cargan los datos
					$aDebe[] = $debe;
					$aPago[] = $pago;
					
					//se busca la maxima/minima cantidad de dinero pagado
					if( $pago > $cantMax ) $cantMax = $pago;
					if( $debe > $cantMax ) $cantMax = $debe;

				}
				$aLabels[] = $pagos[$i]['mes']; //lectura del eje x
			}
			
			$aData[0]['data'] = $aDebe;
			$aData[0]['alpha'] = 60;
			$aData[0]['colorLinea'] = '#FF0000';
			$aData[0]['tamKey'] = 10;
			$aData[0]['leyenda'] = 'Deudas';
			
			$aData[1]['data'] = $aPago;
			$aData[1]['alpha'] = 60;
			$aData[1]['colorLinea'] = '#0000FF';
			$aData[1]['tamKey'] = 10;
			$aData[1]['leyenda'] = 'Pagos';
		}
		
		
		$sTitulo= "Pagos del Cliente";
		$yLegend='Pesos';
		$xLegend='Meses';
		$aLabelX= $aLabels;
		$iYmin=0;
		$iYmax=$cantMax + 50;
		
		$this->dataLineGraph($aData,$sTitulo,$yLegend,$xLegend,$aLabelX,$iWidth,$iHeight,$iYmin,$iYmax,$iShowLegend);
		
	}
	
	function prueba(){
		$this->setearSubMenu();
		
		
	}
	
	/**
	 * Grafica un grafico de lineas. Con una o mas lineas
	 * @return 
	 * @param $aData Object[optional] array con los parametros de las lineas
	 * alpha  		integer (indica el alpha del color de la linea)
	 * colorLinea 	string
	 * tamKey 	 	integer (tamanio de la leyenda)
	 * leyenda  	string
	 * toolTip 		string 	(la forma de informar la leyenda, [leer open-chart])
	 * data			array 	(arreglo con los valores a graficar)
	 * 
	 * $aData puede contener varias lineas
	 * ejemplo 
	 * 		$aData[0]['data'] = $aDebe;
	 * 		$aData[1]['data'] = $aPago;
	 * @param $sTitulo Object[optional] Titulo del grafico
	 * @param $yLegend Object[optional] Leyenda del eje y
	 * @param $xLegend Object[optional] Leyenda del eje x
	 * @param $aLabelX Object[optional] arreglo con los labels del eje x
	 * @param $iWidth Object[optional]  ancho del grafico
	 * @param $iHeight Object[optional] alto del grafico
	 * @param $iYmin Object[optional]   integer con el valor minimo de los valores de la ordenada
	 * @param $iYmax Object[optional]	integer con el valor maximo de los valores de la ordenada
	 * @param $iShowLegend Object[optional] 0 no muestra leyenda, 1 muestra leyenda
	 */
	function dataLineGraph($aData=null,$sTitulo='Titulo de dataline',$yLegend='Eje Y',$xLegend='Eje X',$aLabelX='',$iWidth=500,$iHeight=250,$iYmin=0,$iYmax=400,$iShowLegend=1){

		if($aData!=null){
			
			uses( 'open-flash-chart' );
			
			//crea el grafico
			$g = new graph();
			
			//
			$iMaxX = 0;
			//recorre las lineas a dibujar
			foreach($aData as $aLinea){
				
				$alpha = (isset($aLinea['alpha'])?$aLinea['alpha']:60);
				$colour = (isset($aLinea['colorLinea'])?$aLinea['colorLinea']:'#000000');
				$tamKey = (isset($aLinea['tamKey'])?$aLinea['tamKey']:10);
				$sLeyenda = (isset($aLinea['leyenda'])?$aLinea['leyenda']:'Leyenda');
				$sToolTip = (isset($aLinea['toolTip'])?$aLinea['toolTip']:'#key#: $#val#');
				
				//linea de deudas
				$line = new line(3, $colour);
				
				// string de leyenda , tamanio
				$line->key( $sLeyenda, $tamKey );
				
				if(isset($aLinea['data'])){	
					$aValores = $aLinea['data'];
		
					foreach($aValores as $aValor){
						$line->add_data_tip( $aValor, "");
					}
					
					$g->data_sets[] = $line;
					
					//para generar un arreglo previamente en el caso de que iShowLegend = 0
					$iMaxX = (sizeof($aValores)>$iMaxX)?sizeof($aValores):$iMaxX;
				}
			}
			
			// setea las leyendas
			if($iShowLegend){
				$titleStyle = '{font-size: 18px; color: #A0A0A0	;}';
				$steps = 10;
				$g->set_y_legend( $yLegend, 10, '#A0A0A0' );
				$g->set_x_legend( $xLegend, 10, '#A0A0A0' );
			}
			else{
				$titleStyle = '{font-size: 10px; color: #A0A0A0	;}';
				$aLabelX = '';
				for($iLeg=0;$iLeg<$iMaxX;$iLeg++){$aLabelX[]='';}
				$steps = 1;
			}
							
			//titulo
			$g->title($sTitulo, $titleStyle );
			$g->set_tool_tip( $sToolTip );//lo que se muestra en el mouse over
			
			//leyenda del eje x
			$g->set_x_labels( $aLabelX );			
						
			//atributos de la grafica
			$g->set_x_label_style( 10, '#A0A0A0', 0, 1 );
			$g->set_y_label_style( 10, '#A0A0A0' );
			$g->x_axis_colour( '#A0A0A0', '#FFFFFF' );
			$g->y_axis_colour( '#A0A0A0', '#FFFFFF' );
			
			$g->set_y_min( $iYmin );
			$g->set_y_max( $iYmax);
			
			$g->y_label_steps( $steps );

			$g->set_width( $iWidth );
			$g->set_height( $iHeight );
			$g->set_output_type('js');
			echo $g->render();	
		}
		
	}
	
	/**
	 * Realiza una grafica en forma de tarta
	 * @return swf
	 * @param $sValues string de valores separados por comas
	 * @param $sLabels string de labels separados por comas
	 * @param $aProperties
	 * arreglo con las propiedades del grafico separada con pipes
	 * titulo : Titulo
	 * cssTitulo : css del titulo
	 * cssLabels : css de los labels
	 * 
	 * Ejemplo en la vista
	 * <?php
	 * $sValor = '10,20,30,30,10';
	 * $sLabel = 'IE,Firefox,Opera,Wii,Other';
	 * $pie = $this->requestAction("informes/pieGraph/$sValor/$sLabel/");
	 * ?>
	 */
	function pieGraph($sValues='',$sLabels='',$aProperties=''){

		//valores
		$aValor = explode(',',$sValues);
		$aLabel = explode(',',$sLabels);
		
		//los valores y los labes tienen que coincidir
		$iTamValor = sizeof($aValor);
		$iTamLabel = sizeof($aLabel);

		$bGraficar = (($iTamValor > 0) AND ($iTamLabel == $iTamValor));

		if($bGraficar){
			
			//propiedades de dibujado
			if(isset($aProperties['titulo'])){ $sTitulo = $aProperties['titulo'];}
			else{$sTitulo = 'Título';}
			
			if(isset($aProperties['cssTitulo'])){$sCssTitulo = $aProperties['cssTitulo'];}
			else{$sCssTitulo = "{font-size:18px; color: #d01f3c}";}
			
			if(isset($aProperties['cssLabels'])){$sCssLabels = $aProperties['cssLabels'];}
			else{$sCssLabels = "{font-size: 12px; color: #404040;}";}
			
			uses('open-flash-chart');
			
			$g = new graph();
			$g->set_output_type('js');
			
			$g->pie(80,'#505050',$sCssLabels);
			$g->pie_values( $aValor, $aLabel );
						
			$g->pie_slice_colours( array('#000111','#000aa0','#C79810','#d03f3c','#356ab0','#C79cc0','#daaf3c','#aa6aa0','#C70010') );
			
			$g->set_tool_tip( '#val#%' );
			
			$g->title( $sTitulo, $sCssTitulo );
			echo $g->render();
			
		}
	
	}

	function informarCustodias(){
		//seteo el submenu de informes
		$this->setearSubMenu();
		
		//obtengo todos los clientes
		$this->ModelLoader->setController($this);
		$this->ModelLoader->load('Cliente');	
		$aFields = array('id');	
		$aClientes = $this->Cliente->findAll($aFields);
		
		//por cada uno pregunto cuantas cajas tiene en la fecha actual
		$dFecha = date('Y-m-d');
		foreach($aClientes as $aCliente){
			$iIdCliente = $aCliente['Cliente']['id'];
			$prest = $this->requestAction("prestacions/getCantCajasCustodiadas/$iIdCliente/$dFechaDesde/$dFechaHasta/");
				$cajas[$i] = $prest;

				$cajas[$i]['total'] = $totalAnt + $cajas[$i]['altas'] - $cajas[$i]['bajas'];
				$totalAnt = $cajas[$i]['total'];

		}
		
	}

	function setearSubMenu(){
		
		$aSubMenu[0]['title'] = 'Clientes';
		$aSubMenu[0]['href']	 = PATH . 'informes/listarInformarClientes';
		$aSubMenu[0]['image']	 = PATH_IMAGE_SUBMENU . 'btn_cliente_informe.png';
		
		/*$aSubMenu[1]['title'] = 'Custodias';
		$aSubMenu[1]['href']	 = PATH . 'informes/informarCustodias';
		$aSubMenu[1]['image']	 = PATH_IMAGE_SUBMENU . 'btn_custodias_informe.png';
		
		$aSubMenu[2]['title'] = 'Ingresos';
		$aSubMenu[2]['href']	 = PATH . 'informes/informarIngresos';
		$aSubMenu[2]['image']	 = '';
		
		$aSubMenu[3]['title'] = 'Estados';
		$aSubMenu[3]['href']	 = PATH . 'informes/informarEstados';
		$aSubMenu[3]['image']	 = '';
		
		$aSubMenu[4]['title'] = 'Evolucion';
		$aSubMenu[4]['href']	 = PATH . 'informes/informarEvolucion';
		$aSubMenu[4]['image']	 = '';*/
		
		$this->set('aSubMenu', $aSubMenu);
	
	}
}	
?>